//这个文件通过状态机来控制暗黑2颜色代码的渲染，更简单稳定
import { tableColor } from './appContext.json';
const colorMap: { [key: string]: string } = tableColor;
export interface D2AppText {
    color?: string,
    text: string,
    isNewLine?: boolean,
}

export function toAppText(rawD2Text: string | undefined): D2AppText[]{
    const key1 = "ÿ"
    const key2 = "c"
    let catchCodeStatus = 0;

    let rst: D2AppText[] = [];
    let elements:D2AppText[] = [];
    if (undefined === rawD2Text) {
        return rst;
    }

    
    //初始状态，currentAppText是一个空对象，等待接收颜色代码
    let currentAppText: D2AppText | undefined = {
        color: undefined,
        text: "",
        isNewLine: false,
    };

    let nextColor: string | undefined = undefined;
    //这是一个有限状态机
    for (let char, idx = 0; idx < rawD2Text.length; idx++) {
        char = rawD2Text[idx];
        if (char === '\n') {

            if (currentAppText.text !== '' || currentAppText.isNewLine) {
                //如果当前文本或颜色非空，才添加到结果中，不然就丢弃
                currentAppText.isNewLine = true;
                elements.push(currentAppText);
            }else{
                //每一次换行和 \n 一一对应
                elements.push({
                    color: nextColor,
                    text: '',
                    isNewLine: true,
                });
            }
            currentAppText = {
                color: nextColor,
                text: '',
                isNewLine: false,
            };
           
        } else {
            currentAppText.text += char;
        }
        
        if (char === key1) {
            catchCodeStatus = 1;
        } else if (catchCodeStatus === 1) {
            if (char === key2) {
                catchCodeStatus = 2;
            } else {
                catchCodeStatus = 0;
            }
        } else if (catchCodeStatus === 2) {
            let code = "ÿc" + char;
            if (code in colorMap) {
                // 移除最后三个字符，因为code变量正好是3个字符("ÿc" + char)，这些字符不应该包含在文本中
                currentAppText.text = currentAppText.text?.slice(0, -3) || '';
                //如果当前文本或颜色非空，才添加到结果中，不然就丢弃
                if (currentAppText.text !== undefined || currentAppText.color !== undefined) {
                    elements.push(currentAppText);
                }
                currentAppText = {
                    color: undefined,
                    text:''
                }
                currentAppText.color = colorMap[code];
                nextColor = colorMap[code];
            }
            catchCodeStatus = 0;
        }
        //如果到这里已经是最后一个字符了，append到rst中
        if (idx === rawD2Text.length - 1) {
            //currentLine.push(currentAppText);
            currentAppText.isNewLine = true;
            elements.push(currentAppText);
        }
    }
    // 收集所有行，处理换行并实现倒序输出
    let lines: D2AppText[][] = [];
    let currentLine: D2AppText[] = [];
    
    // 遍历所有元素，按换行符分割成行
    for (let i = 0; i < elements.length; i++) {
        // 将当前元素添加到当前行
        currentLine.push(elements[i]);
        
        // 如果当前元素是换行符，将当前行添加到lines并重置currentLine
        if (elements[i].isNewLine) {
            lines.push([...currentLine]); // 深拷贝当前行
            currentLine = [];
        }
    }
    
    // 处理最后一行（如果有未添加的内容）这个是我没有想到的，所以损失了一行
    if (currentLine.length > 0) {
        lines.push(currentLine);
    }
    
    // 将行倒序，实现从上到下的正确显示
    lines = lines.reverse();
    
    // 将二维数组转换为一维数组返回
    for (let i = 0; i < lines.length; i++) {
        for (let j = 0; j < lines[i].length; j++) {
            rst.push(lines[i][j]);
        }
    }
    
    return rst;

}